package com.demo.chapter11future;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

//Future是jdk1.5提供的，传统的使用方式如下
//并发：一个处理器多个任务
//并行：多处理器运行
public class FutureDemo {
	
	public static void demo(){
		//创建一个ExecutorService，通过它你可以向线程池提交任务
		ExecutorService executor = Executors.newCachedThreadPool();
		//向ExecutorService提交一个Callable对象
		Future<Double> future = executor.submit(new Callable<Double>(){

			@Override
			//以异步方式在新的线程池中执行耗时的操作
			public Double call() throws Exception {
				return doSomeLong();
			}
			
		});
		//异步操作进行的同时，你可以做其它操作
		doSomeElse();
		
		//如果你已经到了没有异步操作的结果就无法继续任何有意义的工作时，可以调用它的get方法去获取操作的结果
		try{
			//获取异步操作结果，如果最终被阻塞，无法得到结果，那么最多等待1秒后退出
			Double result = future.get(1, TimeUnit.SECONDS);
		}catch(ExecutionException e){
			
		}catch (InterruptedException e) {
			
		}catch (TimeoutException e) {
			
		}
	}
	
	public static Double doSomeLong(){
		//一段耗时操作
		return 0.0;
	}
	
	public static Double doSomeElse(){
		//其它操作
		return 0.0;
	}

}
